/**
 * @(#)Logger.java Mar 6, 2007
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: Mar 6, 2007 - 1:25:53 PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>Mar 6, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.logging.logback;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import org.slf4j.LoggerFactory;

/**
 * Logger B&aacute;sico para utilizarse a manera de indirecci&oacute;n
 * de Log4j y util.Logging
 * <br/>Paquete Original: com.psiqueware.basico.logging
 * <br/>Nombre  Original: Logger
 * <br/>Oprima para ver : <a href="Logger.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a>
 * @version Revision: 1.1 Mar 6, 2007 1:25:53 PM
 * @noinspection ClassWithoutNoArgConstructor, ClassWithoutToString
 */
public final class LoggerBack implements com.psiqueware.alheli.logging.Logger
{

    private final org.slf4j.Logger m_logger;

    /**
     * Crea un logger para la cadena.
     *
     * @param s cadena que va a identificar nuestro logger.
     */

    public LoggerBack(final String s)
    {
        m_logger = LoggerFactory.getLogger(s);
    }

    /**
     * Crea un logger para la clase.
     *
     * @param clazz cuyoo logger se quiere crear.
     */
    public LoggerBack(final Class clazz)
    {
        m_logger = LoggerFactory.getLogger(clazz);
    }


    /**
     * Se utiliza para mensajes similares al modo "verbose" en otras aplicaciones.
     * Implica un alto detalle de logeo.
     *
     * @param o object a imprimir.
     */
    public void info(final Object o)
    {
        m_logger.info(Formato.formatea(o));
    }

    /**
     * Se utiliza para mensajes similares al modo "verbose" en otras aplicaciones.
     * Implica un alto detalle de logeo.
     *
     * @param o object a imprimir.
     */
    public void info(final Object o, final Throwable throwable)
    {
        m_logger.info(Formato.formatea(o), throwable);
        m_logger.info(Formato.formatea(throwable));
    }

    /**
     * Se utiliza para escribir mensajes de depuraci&oacute;n.
     * Estos eventos este m_log no debe estar activado cuando la aplicaci&oacute;n se encuentre en producci&oacute;n.
     *
     * @param o object
     */
    public void debug(final Object o)
    {
        m_logger.debug(Formato.formatea(o));
    }

    /**
     * Se utiliza para escribir mensajes de depuraci&oacute;n.
     * Estos eventos este m_log no debe estar activado cuando la aplicaci&oacute;n se encuentre en producci&oacute;n.
     *
     * @param o object
     */
    public void debug(final Object o, final Throwable throwable)
    {
        m_logger.debug(Formato.formatea(o), throwable);
        m_logger.debug(Formato.formatea(throwable));
    }

    /**
     * Se utiliza para mensajes de alerta sobre eventos que se desea mantener constancia.
     * Estos eventos no afectan el correcto funcionamiento del programa.
     * A partir de este nivel se pretende utilizar en producci&oacute;n los logs.
     *
     * @param o object
     */
    public void warn(final Object o)
    {
        m_logger.warn(Formato.formatea(o));
    }

    /**
     * Se utiliza para mensajes de alerta sobre eventos que se desea mantener constancia.
     * Estos eventos no afectan el correcto funcionamiento del programa.
     * A partir de este nivel se pretende utilizar en producci&oacute;n los logs.
     *
     * @param o object
     */
    public void warn(final Object o, final Throwable throwable)
    {
        m_logger.warn(Formato.formatea(o), throwable);
        m_logger.warn(Formato.formatea(throwable));
    }

    /**
     * Se utiliza en mensajes de error de la aplicaci&oacute;n que se desea guardar.
     * Estos eventos afectan al programa pero lo dejan seguir funcionando, como por ejemplo que alg&uacute;n par&aacute;metro de configuraci&oacute;n no es correcto y se carga el par&aacute;metro por defecto.
     *
     * @param o object
     */
    public void error(final Object o)
    {
        m_logger.error(Formato.formatea(o));
    }

    /**
     * Se utiliza en mensajes de error de la aplicaci&oacute;n que se desea guardar.
     * Estos eventos afectan al programa pero lo dejan seguir funcionando, como por ejemplo que alg&uacute;n par&aacute;metro de configuraci&oacute;n no es correcto y se carga el par&aacute;metro por defecto.
     *
     * @param o object
     */
    public void error(final Object o, final Throwable throwable)
    {
        m_logger.error(Formato.formatea(o), throwable);
        m_logger.error(Formato.formatea(throwable));
    }

    /**
     * Se utiliza para mensajes cr&iacute;ticos del sistema.
     * Generalmente luego de guardar el mensaje el programa abortar&aacute;.
     *
     * @param o a logear.
     */
    public void fatal(final Object o)
    {
        m_logger.error(Formato.formatea(o));
        System.exit(1);
    }

    /**
     * Se utiliza para mensajes cr&iacute;ticos del sistema.
     * Generalmente luego de guardar el mensaje el programa abortar&aacute;.
     *
     * @param o a logear.
     */
    public void fatal(final Object o, final Throwable throwable)
    {
        m_logger.error(Formato.formatea(o), throwable);
        m_logger.error(Formato.formatea(throwable));
        System.exit(1);
    }


    public boolean isDebugEnabled()
    {
        return m_logger.isDebugEnabled();
    }

    public boolean isInfoEnabled()
    {
        return m_logger.isInfoEnabled();
    }

    /**
     * Utilidades para manipular LogBack programaticamente.
     * <br/>Paquete Original: com.psiqueware.alheli.logging.logback
     * <br/>Nombre  Original: LoggerBack$Util
     * <br/><a href="LoggerBack$Util.java.html"><i>Ver C&oacute;digo Fuente</i> </a>
     *
     * @author <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a>
     * @version Revision: 1.0
     */
    public static class Util
    {

        /**
         * Cambia el nivel de Logging.
         *
         * @param level a establecer.
         */
        public static void cambiarNivelLogging(final Level level)
        {
            Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
            root.setLevel(level);
        }
    }
}